package com.mvc.dao.impl;


import com.mvc.utils.JDBCUtils;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author wzm
 * @create 2023-06-16 10:38
 */
//基本的dao工具方法提供通用的工具  传入不同的sql和参数得到想要的结果
public class BaseDao {
   private Connection conn = null;
   private QueryRunner queryRunner = new QueryRunner();

    /**
     *   增删改使用通用方法
     * @param sql 传入需要执行的sql
     * @param args 可变参数
     * @return 成功返回受影响行数  失败返回-1
     */
    public int update(String sql,Object... args){
        try {
             conn = JDBCUtils.getConn();
            return queryRunner.update(conn,sql,args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return -1;//失败返回-1
    }

    /**
     * 通用查询单个对象的方法
     * @param clazz 传入需要查询到的实体.class
     * @param sql 不同表的查询sql
     * @param args 不同的可变参数
     * @param <T> 根据传入实体.class  => 实体  如 Student.class  => T is Student
     * @return 返回的是通过传入的实体.class得到的对象
     */
    public <T>T selectByOne(Class<T> clazz ,String sql,Object... args){
        try {
            conn = JDBCUtils.getConn();
          return    queryRunner.query(conn,sql,new BeanHandler<>(clazz),args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
    }

    /**
     * 通用的查询全部数据的方法
     * @param clazz 传入实体.class
     * @param sql 不同表要执行的sql语句
     * @param args 可变的形参
     * @param <T> 泛型  传入xx.class 返回的实体就是xxx 但是方法的返回值需要加<T>泛型
     * @return  成功返回泛型集合 失败返回null
     */
    public  <T>List<T> selectForList(Class<T> clazz , String sql, Object... args){
        try {
            conn = JDBCUtils.getConn();
            return    queryRunner.query(conn,sql,new BeanListHandler<>(clazz),args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
    }


    /**
     * 查询不同表单个值
     * @param sql 不同表需要执行的sql
     * @param args 可变形参
     * @return 成功返回查询后的对象  失败返回null
     */
  public Object selectForValue(String sql,Object... args){
      try {
          conn=JDBCUtils.getConn();
          return queryRunner.query(conn,sql,new ScalarHandler<>(),args);
      } catch (SQLException e) {
          e.printStackTrace();
      } finally {
          DbUtils.closeQuietly(conn);
      }
      return null;//失败返回null
  }
}
